LPIC 102 - EXAM
Gestion usuarios
Contraseñas, usuarios y grupos
/etc/passwd
nombre_usuario:contraseña:UID:GID:información:directorio_home:shell
/etc/shadow
nombre_usuario:contraseña_encriptada:última_modificación:minimo:maximo:aviso:inactivo:expiración:reservado
/etc/group
nombre_grupo:contraseña:GID:lista_de_usuarios
Useradd
Parámetro | Nota |
---|---|
-c | Custom comments |
-d | Custom home |
-e | Date disable user |
-f | Password expire time until disable |
-g | GID |
-G | Secondary groups |
-k | Skeleton path |
-m | Creates home if it does no exists |
-M | Not create home |
-s | Shell |
-u | UID |
Passwd
$ passwd -S # O passwd -status
carol P 12/07/2019 0 99999 7 -1
Campo | Nota |
---|---|
P /L /NP | Password, Locked, NoPass |
12/07/2019 | Último cambio pass |
0 | Minima edad cambio pass |
99999 | Máxima edad |
7 | Warning period |
-1 | Periodo inactividad antes bloqueo |
Opciones | Nota |
---|---|
-S | Status |
-l | Lock |
-u | Unlock |
Chage
$ chage -l israel
Last password change : Apr 17, 2025
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
Opciones | Nota |
---|---|
-m 5 user | Minimo días entre cambios pass |
-M 30 user | Pass expiration |
-d 10 user | Cambiar el numero de dias pass changed. 0 fuerza cambio pass next login |
-W 10 user | Warning period |
-I 10 user | Dias inactividad antes de ser lock |
Log users
$ last
israel tty7 :0 Sun Jun 29 08:13 gone - no logout
reboot system boot 6.8.0-62-generic Sun Jun 29 08:12 still running
israel tty7 :0 Sat Jun 28 18:30 - 23:07 (04:36)
reboot system boot 6.8.0-62-generic Sat Jun 28 18:30 - 23:07 (04:36)
israel tty7 :0 Sat Jun 28 12:39 - 14:40 (02:01)
$ who
israel tty7 2025-06-29 08:13 (:0)
$ w
07:40:18 up 1:27, 1 user, load average: 2,20, 1,94, 1,89
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
israel - 08:13 1:26m 0.00s 0.05s lightdm --session-child 13 20
Comando | Nota |
---|---|
last | Listar los últimos accessos |
who | Usuarios activos conectados |
w | Lo mismo que who pero con más info |
Getent
-
passwd
: Para consultar la base de datos de usuarios. -
group
: Para consultar la base de datos de grupos. -
hosts
: Para consultar la base de datos de nombres de host. -
services
: Para consultar la base de datos de servicios de red. -
protocols
: Para consultar la base de datos de protocolos de red.
Especificar BBDD: getent -s files hosts aaa.com
Nsswitch
El archivo de configuración es /etc/nsswitch.conf
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.
passwd: files systemd
group: files systemd
shadow: files systemd
gshadow: files systemd
hosts: files mdns4_minimal [NOTFOUND=return] dns myhostname mymachines
networks: files
protocols: db files
services: db files
ethers: db files
rpc: db files
Configuración | Nota |
---|---|
[!UNAVAIL=return] | Si el servicio está down, dejar de buscar en el resto |
[result=action] | Realizar resultado si se obtiene result |
[NOTFOUND=return] | Si la busqueda funciona, pero no encuentra resultado. Stop |
/etc/resolv.conf
Componente | Nota |
---|---|
nameserver | DNS server IP |
search | Añade dominio a los hosts em ñas busquedas |
domain | Define dominio local |
option | Añadir opciones como timeout:3 |
Cron
* * * * * comando_a_ejecutar
Los cinco primeros campos representan el tiempo y tienen el siguiente significado:
- Minuto: (0-59) El minuto en que se ejecutará el comando.
- Hora: (0-23) La hora en que se ejecutará el comando (en formato de 24 horas).
- Día del mes: (1-31) El día del mes en que se ejecutará el comando.
- Mes: (1-12) El mes en que se ejecutará el comando.
- Día de la semana: (0-7) El día de la semana en que se ejecutará el comando, donde 0 y 7 representan el domingo.
Ejemplos de programación
-
Ejecutar un comando cada minuto:
* * * * * comando_a_ejecutar
-
Ejecutar un comando a las 3:30 AM todos los días:
30 3 * * * comando_a_ejecutar
-
Ejecutar un comando todos los lunes a las 5 PM:
0 17 * * 1 comando_a_ejecutar
-
Ejecutar un comando el 1 de cada mes a la medianoche:
0 0 1 * * comando_a_ejecutar
-
Ejecutar un comando cada 15 minutos:
*/15 * * * * comando_a_ejecutar
-
Ejecutar un comando a las 10 AM el primer día de cada mes:
0 10 1 * * comando_a_ejecutar
Caracteres especiales
- **Asterisco (**
*
) : Representa "cada" unidad de tiempo. Por ejemplo,*
en el campo de minutos significa "cada minuto". - **Barra (**
/
) : Se utiliza para especificar incrementos. Por ejemplo,*/5
en el campo de minutos significa "cada 5 minutos". - **Coma (**
,
) : Se utiliza para separar múltiples valores. Por ejemplo,1,2,3
en el campo de días del mes significa "el 1, 2 y 3 de cada mes". - **Guion (**
-
) : Se utiliza para especificar un rango. Por ejemplo,1-5
en el campo de días de la semana significa "de lunes a viernes".
Edición del crontab
crontab -e
Visualización de tareas programadas
crontab -l
Allow y deny
Los archivos cron.allow
y cron.deny
son utilizados en sistemas Unix y Linux para controlar el acceso a la funcionalidad de cron, que permite a los usuarios programar tareas automáticas. Estos archivos determinan qué usuarios pueden o no pueden usar el sistema de cron.
La ruta es /etc/cron.allow
y /etc/cron.deny
cron.conf
# Configuración global para cron
# Permitir que solo ciertos usuarios ejecuten cron
ALLOW_USERS=usuario1,usuario2
# Deshabilitar el registro de cron
NOLOGGING=true
# Establecer el directorio de trabajo predeterminado
DEFAULT_DIR=/var/spool/cron
Systemd
1. **Service Units (** .service
)
- Representan servicios que se ejecutan en segundo plano.
- Se utilizan para iniciar, detener y gestionar procesos.
- Ejemplo:
httpd.service
para el servidor web Apache.
2. **Socket Units (** .socket
)
- Representan sockets de red o de sistema que pueden ser utilizados por servicios.
- Permiten la activación bajo demanda de servicios cuando hay actividad en el socket.
- Ejemplo:
ssh.socket
para el servicio SSH.
3. **Target Units (** .target
)
- Agrupan otras unidades y se utilizan para organizar el inicio de servicios.
- Permiten gestionar el arranque de múltiples servicios como un solo grupo.
- Ejemplo:
multi-user.target
agrupa servicios necesarios para un entorno de múltiples usuarios.
4. **Mount Units (** .mount
)
- Representan puntos de montaje de sistemas de archivos.
- Se utilizan para montar y desmontar sistemas de archivos en el arranque o bajo demanda.
- Ejemplo:
home.mount
para montar el directorio/home
.
5. **Automount Units (** .automount
)
- Se utilizan para montar sistemas de archivos automáticamente cuando se accede a ellos.
- Permiten la activación bajo demanda de puntos de montaje.
- Ejemplo:
media-usb.automount
para montar dispositivos USB automáticamente.
6. **Timer Units (** .timer
)
- Representan temporizadores que pueden activar otras unidades (generalmente servicios) en intervalos específicos.
- Se utilizan como una alternativa a
cron
para programar tareas. - Ejemplo:
backup.timer
para realizar copias de seguridad periódicas.
7. **Path Units (** .path
)
- Monitorean cambios en el sistema de archivos y pueden activar otras unidades en respuesta a esos cambios.
- Se utilizan para ejecutar servicios cuando se crean, eliminan o modifican archivos o directorios.
- Ejemplo:
watch-directory.path
para activar un servicio cuando se modifica un directorio específico.
8. **Slice Units (** .slice
)
- Se utilizan para agrupar y gestionar recursos del sistema, como CPU y memoria, para un conjunto de servicios o procesos.
- Permiten la gestión de recursos de manera jerárquica.
- Ejemplo:
user.slice
para agrupar todos los procesos de un usuario.
9. **Scope Units (** .scope
)
- Representan procesos que son gestionados por
systemd
, pero que no son iniciados por él. - Se utilizan para agrupar procesos que son iniciados fuera de
systemd
, como aquellos iniciados por el usuario. - Ejemplo: un grupo de procesos iniciados por un entorno gráfico.
Manejo units
systemctl list-units --state active --type service
sudo systemctl disable UNIT --now
At
El comando at
en Linux se utiliza para programar la ejecución de comandos o scripts en un momento específico en el futuro.
-
Programar un comando para que se ejecute a una hora específica:
at 15:00
Después de ejecutar este comando, puedes escribir el comando que deseas ejecutar a las 15:00 y luego presionar
Ctrl+D
para finalizar. -
Programar un comando para que se ejecute en 10 minutos:
echo "comando_a_ejecutar" | at now + 10 minutes
-
Programar un script para que se ejecute mañana a las 8 AM:
echo "/ruta/al/script.sh" | at 08:00 tomorrow
-
Ver las tareas programadas con
at
:atq
Este comando muestra una lista de las tareas programadas para el usuario actual.
-
Eliminar una tarea programada:
atrm [número_de_tarea]
Donde
[número_de_tarea]
es el número que aparece en la lista deatq
.
- Permisos: El uso de
at
puede estar restringido por los archivos/etc/at.allow
y/etc/at.deny
. Siat.allow
existe, solo los usuarios listados en él pueden usarat
. Siat.deny
existe, los usuarios listados en él no pueden usarat
. - Salida: La salida de los comandos ejecutados por
at
se envía al correo del usuario que programó la tarea
Hora y fecha
timedatectl
$ timedatectl
Local time: Sat 2025-06-28 18:12:10 CEST
Universal time: Sat 2025-06-28 16:12:10 UTC
RTC time: Sat 2025-06-28 16:12:10
Time zone: Europe/Madrid (CEST, +0200)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
tzselect
$ tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent, ocean, "coord", or "TZ".
1) Africa
2) Americas
3) Antarctica
4) Asia
5) Atlantic Ocean
6) Australia
7) Europe
/etc/localtime
En un symlink. Se puede usar para cambiar la zona de forma manual
$ ls -la /etc/localtime
lrwxrwxrwx 1 root root 33 Apr 17 19:53 /etc/localtime -> /usr/share/zoneinfo/Europe/Madrid
Idioma
El idioma y la codificación de caracteres se llaman locales. $LANG
contiene esta información. Ejemplo de portugues de brasil: pt_BR.UTF-8
$ cat /etc/locale.conf
LANG="en_US.UTF-8"
LC_NUMERIC="es_ES.UTF-8"
LC_MONETARY="es_ES.UTF-8"
LC_PAPER="es_ES.UTF-8"
LC_NAME="es_ES.UTF-8"
LC_ADDRESS="es_ES.UTF-8"
LC_TELEPHONE="es_ES.UTF-8"
LC_MEASUREMENT="es_ES.UTF-8"
LC_IDENTIFICATION="es_ES.UTF-8"
/etc/locale.conf
Contiene la definición de las variables. Se pueden añadir más variables a la configuración:
LC_TIME # Establece formato de dia y hora
LC_ALL #Sobre-escribre todas las variables
Networking
La defición de interfaces se encuentra en /sys/class/net
drwxr-xr-x 2 root root 0 Jun 28 22:41 .
drwxr-xr-x 84 root root 0 Jun 28 18:30 ..
lrwxrwxrwx 1 root root 0 Jun 28 18:30 eno1 -> ../../devices/pci0000:00/0000:00:1f.6/net/eno1
lrwxrwxrwx 1 root root 0 Jun 28 18:30 lo -> ../../devices/virtual/net/lo
lrwxrwxrwx 1 root root 0 Jun 28 18:30 lxcbr0 -> ../../devices/virtual/net/lxcbr0
lrwxrwxrwx 1 root root 0 Jun 28 18:30 virbr0 -> ../../devices/virtual/net/virbr0
lrwxrwxrwx 1 root root 0 Jun 28 18:30 wlp4s0 -> ../../devices/pci0000:00/0000:00:1b.0/0000:04:00.0/net/wlp4s0
Ifupdown
Depreciado: /etc/network/interfaces
es su archivo de configuración. Se maneja con los comandos ifup
y ifdown
. El servicio como tal se llama ifupdown
NetworkManager
- nmcli general => General status and operations
- nmcli device => Show devices managed
- nmcli device desconnect `<device>` => Disconnects an interface
- nmcli device connect `<device>` => Connect interface
- nmcli networking => Network control
- nmcli radio => Radio switches. Ej WI-Fi
- nmcli connection => Manages connections
- nmcli connection down `<connection>` => Turn off a connection
- nmcli agent => Polkit control
- nmcli monitor => Monitor changes
Systemd-networkd
-
systemd-networkd.service
Network Configuration -
systemd-resolved.service
Network Name Resolution
DIrectorios de configuración de más prioridad a menos
-
/etc/systemd/network
-
/run/systemd/network
-
/lib/systemd/network
La autenticación en redes wifi se hace con un programa externo: wpa_supplicant
. Generar una clave wpa: # wpa_passphrase MyWifi > /etc/wpa_supplicant/wpa_supplicant-wlo1.conf
$ wpa_passphrase Mywifi
# reading passphrase from stdin
1234567890
network={
ssid="Mywifi"
#psk="1234567890"
psk=678ce0d3122aca9c677e408b35c783346da61ae038065a7182390cb2b451bc75
}
Automáticamente crea el servicio mediante wpa_supplicant
para crear el servicio wpa_supplicant@wlo1.service
. Despues de esto se debe crear un archivo .network con la configuración
Ip
ip addr add 192.168.5.5/24 dev enp0s8
ip link set dev enp0s8 down
ip link show dev enp0s8
ip link set enp0s8 mtu 2000
Para ver estadísticas de red
$ ip stats show dev wlp4s0
3: wlp4s0: group offload subgroup hw_stats_info
l3_stats off used off
3: wlp4s0: group afstats subgroup mpls
3: wlp4s0: group offload subgroup l3_stats off used off
3: wlp4s0: group offload subgroup cpu_hit
3: wlp4s0: group link
RX: bytes packets errors dropped missed mcast
4712024637 3634572 0 438 0 0
TX: bytes packets errors dropped carrier collsns
88842332 410661 0 0 0 0
3: wlp4s0: group xstats_slave subgroup bond suite 802.3ad
3: wlp4s0: group xstats_slave subgroup bridge suite mcast
3: wlp4s0: group xstats_slave subgroup bridge suite stp
3: wlp4s0: group xstats subgroup bond suite 802.3ad
3: wlp4s0: group xstats subgroup bridge suite mcast
3: wlp4s0: group xstats subgroup bridge suite stp
Netstat
Actualmente está depreciado y su remplazo es ss
SS
-
ss -t
(orss -tlnp
for listening TCP ports) -
ss -u
(orss -ulnp
for listening UDP ports) -
ss -r
(orss -rlnp
for routing table sockets)
$ ss -tlnp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:53317 0.0.0.0:* users:(("localsend_app",pid=2561,fd=133))
LISTEN 0 4096 127.0.0.1:37729 0.0.0.0:* users:(("kopia",pid=2910,fd=12))
LISTEN 0 4096 127.0.0.1:6806 0.0.0.0:* users:(("SiYuan-Kernel",pid=12962,fd=43))
LISTEN 0 4096 127.0.0.1:34809 0.0.0.0:* users:(("bridge",pid=3077,fd=13))
LISTEN 0 4096 127.0.0.1:1143 0.0.0.0:* users:(("bridge",pid=3077,fd=15))
LISTEN 0 4096 127.0.0.1:1025 0.0.0.0:* users:(("bridge",pid=3077,fd=18))
LISTEN 0 4096 127.0.0.1:33389 0.0.0.0:* users:(("kopia",pid=2912,fd=12))
Columna | Descripción |
---|---|
Recv-Q | Paquetes recividos por el socket pero que no se han pasado al programa |
Send-Q | Paquetes que han sido enviados pero no se ha recivido el acknowlegment |
Lsof
Opciones | Nota |
---|---|
-i | Puertos en listening. lsof -i@192.168.1.7 para filtrar conexiónlsof -i :22 Para filtrar puerto |
- |
SGUID/SUID
-
rws
Sin permiso de ejecución -
rwS
Con permiso de ejecución
Busqueda. La opción -
ignora el resto de permisos
-
find . -perm 4000
buscar SUID activado -
find . -perm u+s
buscar SUID activado -
/usr/bin/ -perm -2000
Buscar GUID activado -
find /usr/bin/ -perm -g+s
Buscar GUID activado
Fuse
Listar que proceso esta usando un archivo
$ fuser -v .
USERPID ACCESS COMMAND
/root: 580 ..c.. bash
Access | Nota |
---|---|
c | Actual directory |
e | Executing |
f | File open |
F | File open with writing |
r | root directory |
sudo fuser -vn tcp 80
USER PID ACCESS COMMAND
80/tcp: root 1562 F.... apache2
www-data 1564 F.... apache2
www-data 1565 F.... apache2
Opciones | Nota |
---|---|
-v | verbose |
-n | Network |
-k | Kill process accesing file |
Ulimit
Comando | Nota |
---|---|
ulimit -Ha | List hard limits |
ulimit -Sa | List softlimits |
Para cambiar un limite basta con seleccionar la opción y dar un valor: ulimit -f 500
cambiar hard y soft file size. ulimit -Sf 500
cambiar soft file size.
Para hacer los cambios permanetes el archivo de configuración es: /etc/security/limits.conf
Sudo
/etc/sudoers
Archivos de configuración
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
"from ALL hosts"=("as ALL users":"as ALL groups") "alow ALL comands"
Permitir acceso a ejecutar systemctl status apache2
desde el host 192.168.0.222 con el usuario aaa
bbb 192.168.0.222=(aaa) /usr/bin/systemctl status apache2
Editar configuración con visudo
. Cambiar editor con la variable $EDITOR
Declarar alias. Ejemplo: Host_Alias SERVERS = 192.168.1.7, server1, server2
- Host_Alias
- User_Alias
- Cmnd_Alias
Nologin
Para evitar que ningún usuario acceda excepto root, crear un archivo /etc/nologin
con un mensaje. Para evitar que un usuario no acceda temporalmente: $ sudo usermod -s /sbin/nologin user
SSH
SHELL
Characteristics | Login Shells | Non-Login Shells |
---|---|---|
Reads System Config Files | Yes (e.g.,/etc/profile ) | No |
Reads User Config Files | Yes (e.g.,~/.bash_profile ) | No (unless explicitly configured) |
Environment Variables | Sets up from scratch | Inherits from parent shell |
Purpose | Interactive login sessions | Running commands or scripts |
Started By | /bin/login program | From within another shell or program |
Interactive login shell
FILE CONFIG | LEVEL | NOTE |
---|---|---|
/etc/profile | global | Aplica a todo el sistema |
/etc/profile.d/* | global | Aplica a todo el sistema el directorio |
~/.bash_profile | local | Configurar entorno de bash |
~/.bash_login | local | Solo se usa si no existe ~/.bash_login. Comandos que se usan en login |
~/.profile | local | Solo se ejecuta si los anteriores no existen. Carga el directorio ~/bin en variable entorno. Hace source a ~/bashrc |
~/.bash_logout | local | Limpieza de entorno después de logout |
Interactive no login shell
FILE CONFIG | LEVEL | NOTE |
---|---|---|
/etc/bash.bashrc | global | |
~/bashrc | local | Sources ~/.bash_aliases. User specific functions and variables |
Skel
Variable añadida en /etc/adduser.conf
el cual contiene el directorio donde crear el sistema de archivos del usuario
Variables
Las declaración de varaibles con comillas simple usan terminos literales. Declarar variables con doble comillas permite sustitución.
Comando | Nota |
---|---|
readonly reptile=tortoise | Varibale inmutable |
set | Lista todas las variables y funciones declaradas |
unset -v <variable> unset -f <function> | Elimina cualquier variable |
export <variable> declare -x <variable> | Convierte variable local a de entorno. Permite ser heredada |
export -n <variable> | Convierte variable en local |
export | Lista todas las variables en entorno |
env printenv <variable> | Listan todas las variables |
env -i bash | Ejecutar un programa sin variables declaradas |
Variable | Nota |
---|---|
$DISPLAY | screen number |
$HISTCONTROL | - ignorespace - ignoredups - ignoreboth |
$HISTSIZE | Tamaño historial en memoria |
$HISTFILESIZE | Tamaño total en archivo |
$HOME | Home path |
$HOSTNAME | Host name |
$HOSTTYPE | Tipo procesador |
$LANG | Locale |
$LD_LIBRARY_PATH | Shared libary path |
$MAIL | Path donde BASH busca emails |
$MAILCHECK | Frecuencia segundos revision mail |
$PATH | Path de ejecutables |
$SHELL | En mayus variables globales. Lista shell |
$USER | Current user |
Variables especiales bash
Variable | Nota |
---|---|
$? | Resultado del último comando. 0 = success |
$$ | Shell PID |
$! | PID del ultimo comando en backgroud |
$0 - $9 | Parametros posicionales de una funcion |
$# | Numero argumentos pasados comando |
Variables de scripts
Variable | Nota |
---|---|
$* $@ | Todos los argumentos pasados al script |
$# | Número de argumentos |
$0 | Nombre del script |
$! | PID del último programa ejecutado |
La notación para guardar el output de comandos $ OS=`uname -o`
o $ OS=$(uname -o)
Alias
alias oldshell=sh
alias ls='ls --color=auto'
unalias git-info
alias #list all alias
# Expansion dinámica y estática de los alias comillas
$ alias where?='echo $PWD'
$ where?
/home/user2
$ cd Music
$ where?
/home/user2/Music
$ alias where?="echo $PWD"
$ where?
/home/user2
$ cd Music
$ where?
/home/user2
Read
echo "Do you want to continue (y/n)?"
read ANSWER
read -p "Type your first name and last name:" NAME SURNAME
Arrays
declare -a SIZES
SIZES=( 1048576 1073741824 )
echo ${SIZES[0]}
echo ${#SIZES[@]} #Tamaño del array
Condicionales
Condición | Nota |
---|---|
&& | Se ejecuta solo si el comando anterior return 0 |
-a | If file exists |
-b | If is block file |
-c | If is character file |
-d | If is a directory |
-e | If path exists |
-f | if path exist and is regular file |
-g | If SGUID activated |
-h | If is a symbolic link |
-k | If have sticky bit |
-p | If is a pipe file |
-r | If is readable |
-s | If exist directory and not empty |
-S | If is a socket |
-t | If is open in a terminal |
-u | If SUID activated |
-w | If is writteable |
-x | If is executable |
-O | If is owned by user |
-G | If have the same group as the user |
-N | If was modified since las time accessed |
-nt | If path 1 is newer than path 2 |
-ot | If path 1 is older than path 2 |
-ef | If file 1 is a hardlink to file 2 |
-z | If variable is empty |
-n | If variable is not empty |
! | If is false |
-o | If EXPR1 or EXPR2 is true |
User interfaces
Display name: hostname:displaynumber.screennumber
Lanzar aplicación en un monitor específico DISPLAY=:0.1 firefox &
Archivo de configuración: /etc/X11/xorg.conf
- InputDevice
- InputClass
- Monitor
- Device
- Screen
- ServerLayout
Comando para ver información del servidor X11 xdpyinfo
Variable | Nota |
---|---|
$DISPLAY | X11 listar monitor |
$WAYLAND-DISPLAY | Wayland listar monitor |